Skip to content

Git Squash Merge 使用指南

一、什么是 squash merge

squash merge 是 Git 中一种:

只合并代码,不合并提交历史

的合并方式。

适用于:

  • 个人开发分支
  • 临时功能分支
  • 不希望暴露开发过程
  • 不希望远程出现大量 commit
  • 想保持提交记录干净

二、为什么使用 squash merge

假设:

huawei 分支

text
A---B

dev 分支

text
A---B---C---D---E

其中:

  • C D E 是自己开发过程中的提交

如果直接:

bash
git merge dev

最终:

text
A---B--------M
     \      /
      C----D----E

远程会看到:

  • 所有开发记录
  • merge commit
  • 分支关系

提交历史会越来越乱。


三、squash merge 的效果

执行:

bash
git merge --squash dev

最终:

text
A---B---X

其中:

  • X 是一个新的提交
  • C D E 不会进入远程历史

效果相当于:

把 dev 的所有代码压缩成一次提交。


四、核心特点

特点squash merge
合并代码
合并 commit 历史
产生 merge commit
提交记录干净
适合个人开发

五、推荐开发流程


1. 切换到公共分支

bash
git checkout huawei

2. 拉取最新代码

bash
git pull

确保本地分支最新。


3. squash 合并 dev

bash
git merge --squash dev

执行后:

  • 代码会进入暂存区
  • 但不会自动 commit
  • 不会生成 merge commit

4. 查看状态

bash
git status

会看到:

text
Changes to be committed

说明代码已经进入暂存区。


5. 提交代码

bash
git commit -m "新增xxx功能"

此时:

  • 会生成一个全新的 commit
  • 不会保留 dev 的历史记录

6. 推送远程

bash
git push

远程只能看到:

text
新增xxx功能

看不到:

  • dev 分支
  • dev 的 commit
  • merge 历史

六、完整操作示例


当前情况

huawei

text
A---B

dev

text
A---B---C---D---E

执行

bash
git checkout huawei

git pull

git merge --squash dev

git commit -m "新增用户功能"

git push

最终结果

text
A---B---X

其中:

  • X 包含了 C D E 的所有代码
  • 但不会暴露开发过程

七、常见问题


1. squash merge 后为什么没有自动 commit?

因为:

bash
git merge --squash

只会:

  • 合并代码
  • 放入暂存区

不会自动提交。

需要手动:

bash
git commit

2. squash merge 会删除 dev 分支吗?

不会。

只是:

  • 复制代码
  • 不影响 dev 分支

3. squash merge 后还能继续开发吗?

可以。

dev 分支不会受到影响。


4. squash merge 会产生 merge commit 吗?

不会。

这是它最大的优点之一。


八、推荐使用场景

适合:

  • 个人开发分支
  • 功能开发分支
  • 实验分支
  • 临时分支
  • 提交记录需要干净的项目

九、不推荐直接 merge 的原因

直接:

bash
git merge dev

会:

  • 暴露开发过程
  • 出现大量 commit
  • 出现 merge commit
  • 提交记录混乱

尤其多人协作时:

Git 图会越来越复杂。


十、推荐命令速查


squash merge

bash
git merge --squash dev

提交代码

bash
git commit -m "新增功能"

推送远程

bash
git push

查看提交图

bash
git log --oneline --graph

十一、最佳实践(推荐)

bash
# 更新公共分支
git checkout huawei
git pull

# 合并个人开发代码
git merge --squash dev

# 提交
git commit -m "新增xxx功能"

# 推送
git push

十二、总结

方案是否暴露开发历史是否产生 merge commit提交记录
merge复杂
rebase不会较干净
squash merge不会不会最干净

十三、结论

对于:

  • 本地个人开发分支
  • 不想提交 dev 历史
  • 希望远程提交干净

最推荐:

bash
git merge --squash dev
最近更新